#!/usr/bin/python3

import sys  # 引入 sys 模块

# 1) 迭代器
# list = [1, 2, 3, 4]
# it = iter(list)  # 创建迭代器对象
# while True:
#     try:
#         print(next(it))
#     except StopIteration:
#         sys.exit()

# 2）生成器：就是一个迭代器。每次调用生成器，遇到yield时，执行会暂停，并且返回yield后面表达式的值，
# 每次调用生成器的 next() 方法或使用 for 循环进行迭代时，函数会从上次暂停的地方继续执行，
# 直到再次遇到 yield 语句。这样，生成器函数可以逐步产生值，而不需要一次性计算并返回所有结果。
def countdown(n):
    while n > 0:
        yield n
        n -= 1
# 创建生成器对象
generator = countdown(5)

# 通过迭代生成器获取值，配合迭代器的next()方法
print(next(generator))  # 输出: 5
print(next(generator))  # 输出: 4
print(next(generator))  # 输出: 3

# 使用 for 循环迭代生成器
for value in generator:
    print(value)  # 输出: 2 1

# 3）斐波那契数列（后面的数字式前面两个数字之和）
# 第一次执行，返回的a是0；第2次执行，从yield后面继续执行，a被赋值为1；以此类推
import sys
def fibonacci(n):  # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1

f = fibonacci(10)  # f 是一个迭代器，由生成器返回生成
while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()
